<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>Document</title>
</head>
<body>
    
</body>
</html>
<script>
    // 关于堆heap 和栈stack
    // stack为自动分配的内存空间 由系统自动释放  heap是动态分配的内存 大小不一定 也不会自动释放

    // 关于值与引用
    // js中有基本数据类型和引用类型
    // 基本数据类型的变量和值都是存放在栈中 声明之后会分配一块内存空间 基本数据类型之间的赋值是直接把栈内存中存的值赋值给变量
    // 引用类型的变量存在栈中 但是值存在堆中 实际上栈存放的是指向堆的地址 也就是引用类型直接的赋值实质是把引用赋值给一个变量(传址) 所以其指向的内存中的值是一样的

    // 深拷贝和浅拷贝
    // 浅拷贝只赋值一层对象 当对象的属性是引用类型时 实质是复制引用 当引用指向的值改变时，也会跟着改变

    var obj = { a:1, arr: [2,3] };
    var shallowObj = shallowCopy(obj);

    function shallowCopy(src) {
        var dst = {};
        for (var prop in src) {
            console.log(prop, '---->' ,src);
            if (src.hasOwnProperty(prop)) {
                dst[prop] = src[prop];
            }
        }
        return dst;
    }
    console.log(shallowObj.arr);
    // 当一个对象属性的引用值改变时将导致另一个也改变
    shallowObj.arr[1] = 5;
    obj.arr[1]   // = 5
</script>